home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 7661 / 7661.xpi / chrome / isreaditlater.jar / content / RILoptions.js < prev    next >
Text File  |  2009-12-23  |  16KB  |  521 lines

  1. function RILoptions() {
  2.     this.checkmarks = {};
  3.     this.drops = {};
  4.     this.texts = {};
  5.     this.gVKNames = {};
  6.     this.keysDown = [];
  7. }
  8. RILoptions.prototype = {
  9.     
  10.     init : function()
  11.     {
  12.     if (!RIL.inited) RIL.init();
  13.     
  14.         // Configure each tab
  15.         this.configureAccount();
  16.         this.configureOffline();
  17.         this.configureApps();
  18.         this.configureKeyboard();
  19.         this.configureTweaks();
  20.         this.configureAppearance();
  21.         
  22.         // Present a the default tab
  23.     let defaultTab = window.arguments && window.arguments[0] ? window.arguments[0] : 'account';
  24.         this.selectTab( defaultTab );
  25.     },
  26.     
  27.     selectTab : function(tab)
  28.     {
  29.         if (this.currentTab && this.currentTab.value == tab) return;
  30.         
  31.         if (this.currentTab)
  32.             this.currentTab.hidden = true;
  33.         
  34.         this.currentTab = RIL.xul('options_'+tab);
  35.         RIL.xul('options_menu').selectedItem = RIL.xul('options_menu_'+tab);
  36.         this.currentTab.hidden = false;
  37.     },
  38.     
  39.     accept : function()
  40.     {
  41.         // Save settings
  42.         try {
  43.             
  44.             // Old vars for compare
  45.             let oldStoreSecurely = RIL.APP.PREFS.getBool('storeSecurely');
  46.             let oldLogin = RIL.APP.getLogin();
  47.             
  48.             
  49.         // Clean/validate data
  50.         this.validatePerPage();
  51.         
  52.         
  53.         // Save form controls
  54.             let i;
  55.             for(i in this.checkmarks)
  56.             {
  57.                 RIL.APP.PREFS.set( i, this.checkmarks[i].checked );
  58.             }
  59.             
  60.             for(i in this.drops)
  61.             {
  62.                 RIL.APP.PREFS.set( i, this.drops[i].selectedItem.value );
  63.             }
  64.             
  65.             for(i in this.texts)
  66.             {
  67.                 RIL.APP.PREFS.set( i, this.texts[i].value );
  68.             }
  69.         
  70.         
  71.         // Save keyboard shortcuts
  72.         let listitems = RIL.xul('keyboardShortcuts').getElementsByTagName('listitem');
  73.         let id, keySet, value;
  74.         for(let i in listitems) {
  75.         if (listitems[i].id) {
  76.             id = listitems[i].id.replace(RIL.XULnamespace + 'keyboardShortcut','');
  77.             value = listitems[i].value;
  78.             RIL.APP.PREFS.set('hotkey_'+id, value ? value : '', true);
  79.         }
  80.         }
  81.         
  82.         RIL.APP.refreshListInAllOpenWindows();
  83.         RIL.APP.commandInAllOpenWindows('RIL', 'refreshToolbarCountStatus', null, true);
  84.         RIL.APP.commandInAllOpenWindows('RIL', 'checkPage', null, true);
  85.             
  86.             
  87.             // Handle events on changes
  88.             if (oldStoreSecurely != RIL.APP.PREFS.getBool('storeSecurely') && oldLogin)
  89.                 RIL.APP.saveLogin(oldLogin.username, oldLogin.password);
  90.             
  91.             
  92.         } catch(e) {
  93.             Components.utils.reportError(e);
  94.             RIL.APP.PROMPT.alert(window, 'Read It Later', "Oh no! There was an error saving your settings.\n\nYou can get help at readitlaterlist.com/support/\n\nError: "+e);
  95.         }
  96.         
  97.     return true;
  98.     },
  99.     
  100.     cancel : function()
  101.     {
  102.         return true;  
  103.     },
  104.     
  105.     
  106.     
  107.     // -- Account -- //
  108.     
  109.     configureAccount : function()
  110.     {
  111.     try {
  112.         let login = RIL.APP.getLogin();
  113.         
  114.         // Reset
  115.         RIL.xul('optionsForSignedOut').hidden = 
  116.         RIL.xul('optionsForSignedIn').hidden = true;
  117.         
  118.         if (login && login.username)
  119.         {
  120.         RIL.xul('options_username_label').label = 'Logged in as: ' + login.username;
  121.         RIL.xul('optionsForSignedIn').hidden = false;
  122.         RIL.xul('optionsForSignedOut').hidden = true;
  123.         }
  124.         else
  125.         {
  126.         RIL.xul('optionsForSignedIn').hidden = true;
  127.         RIL.xul('optionsForSignedOut').hidden = false;
  128.         }
  129.     } catch(e) {
  130.             Components.utils.reportError(e);
  131.             RIL.APP.d(e);
  132.     }
  133.     },
  134.     
  135.     clearLocalData : function()
  136.     {    
  137.     let login = RIL.APP.getLogin();
  138.             
  139.     if (RIL.APP.PROMPT.confirm(window, 'Read It Later', RIL.l('localEraseConfirm') + "\n\n" + RIL.l('noUndoable') + (login && login.username  ? " \n\n" + RIL.l('noEffectOnline') : '')))
  140.     {
  141.         // reinstall ril database
  142.         RIL.APP.dumpAndReinstallDatabase();
  143.         
  144.         // clear in memory list
  145.         RIL.APP.LIST.fetch();
  146.         
  147.         // clear last get
  148.         RIL.APP.PREFS.set('since', 0);
  149.         
  150.         // delete offline files
  151.         this.clearOfflineCache(true);        
  152.     }
  153.     },
  154.     
  155.     
  156.     
  157.     // -- Offline -- //
  158.     
  159.     configureOffline : function()
  160.     {
  161.     try {
  162.         this.setCheck('autoOffline', 'autoOffline');
  163.         this.setCheck('offlineOptionDownloadWeb', 'getOfflineWeb');
  164.         this.setCheck('offlineOptionDownloadText', 'getOfflineText');
  165.         
  166.         RIL.xul('offlineOptionDownloadWeb').disabled =
  167.         RIL.xul('offlineOptionDownloadText').disabled = !RIL.APP.PREFS.getBool('autoOffline');
  168.         
  169.         RIL.xul('autoOffline').onclick = function()
  170.         {
  171.         RIL.xul('offlineOptionDownloadWeb').disabled =
  172.         RIL.xul('offlineOptionDownloadText').disabled = !this.checked;
  173.         }
  174.         
  175.         this.offlineStatusChanged();
  176.         
  177.     } catch(e) {
  178.             Components.utils.reportError(e);
  179.     }
  180.     },
  181.     
  182.     clearOfflineCache : function(force)
  183.     {    
  184.         if (force || RIL.APP.PROMPT.confirm(window, 'Read It Later', RIL.l('clearCacheConfirm')))
  185.         {
  186.         window.openDialog("chrome://isreaditlater/content/offlineAction.xul", "", "chrome,titlebar,toolbar,centerscreen,resizable", 'clearing');
  187.         }
  188.     },
  189.     
  190.     changeOfflineDirectory : function()
  191.     {
  192.         try {
  193.             
  194.         // Display folder picker
  195.         let nsIFilePicker = Components.interfaces.nsIFilePicker;
  196.         let fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
  197.         fp.init(window, "Select a Folder", nsIFilePicker.modeGetFolder);
  198.         fp.displayDirectory = RIL.APP.ASSETS.DIR_RIL;
  199.         let response = fp.show();
  200.         
  201.         // New folder selected
  202.         if (response == nsIFilePicker.returnOK)
  203.         {
  204.             let oldFolder = RIL.APP.ASSETS.DIR_RIL;
  205.             let newFolder = fp.file;
  206.             
  207.             if (oldFolder.path != newFolder.path)
  208.             {
  209.         window.openDialog("chrome://isreaditlater/content/offlineAction.xul", "", "chrome,titlebar,toolbar,centerscreen,resizable", 'moving', newFolder);                
  210.             }
  211.             
  212.         }
  213.     } catch(e) {Components.utils.reportError(e);}
  214.     },
  215.     
  216.     offlineStatusChanged : function()
  217.     {
  218.     RIL.xul('clearOffline').disabled = RIL.APP.OFFLINE.clearingOffline;
  219.     RIL.xul('moveOffline').disabled = RIL.APP.OFFLINE.movingOffline;    
  220.     },
  221.     
  222.     
  223.     // -- Apps -- //
  224.     
  225.     configureApps : function()
  226.     {
  227.     try {
  228.         this.setCheck('optionsGoogleReader', 'integrate-gr');
  229.     } catch(e) {
  230.             Components.utils.reportError(e);
  231.     }
  232.     },
  233.     
  234.     
  235.     // -- Keyboard -- //
  236.     
  237.     configureKeyboard : function()
  238.     {
  239.     try {
  240.         let listitems = RIL.xul('keyboardShortcuts').getElementsByTagName('listitem');
  241.         let id, keySet;
  242.         for(let i in listitems) {
  243.         if (listitems[i].id) {
  244.             id = listitems[i].id.replace(RIL.XULnamespace + 'keyboardShortcut','');
  245.             keySet = RIL.APP.PREFS.get('hotkey_'+id).split('||');
  246.             listitems[i].value = RIL.APP.PREFS.get('hotkey_'+id);
  247.             RIL.xulId(listitems[i].id + '-v').setAttribute('label', keySet[0] + (keySet[1] ? ' + ' + keySet[1] : '' ) );    
  248.         }
  249.         }
  250.         
  251.         // -- Get Keysets -- //        
  252.         for (var property in KeyEvent) {
  253.         RILoptions.gVKNames[KeyEvent[property]] = property.replace("DOM_","");
  254.         }
  255.         RILoptions.gVKNames[8] = "VK_BACK";
  256.     } catch(e) {
  257.             Components.utils.reportError(e);
  258.     }
  259.     
  260.     },
  261.     
  262.     selectKey : function(event, forceEnabled) {
  263.     let value = forceEnabled ? forceEnabled : RIL.xul('keyboardShortcuts').selectedItem.value.length;
  264.     RIL.xul("newKey").disabled = !value;
  265.     RIL.xul("setKey").disabled = !value;
  266.     RIL.xul("disableKey").disabled = false;
  267.     RIL.xul("disableKey").label = value ? RIL.l('disable') : RIL.l('enable');
  268.     RIL.xul('newKey').value = '';    
  269.     
  270.     if (value)
  271.         setTimeout(RIL.xul('newKey').focus,10);
  272.     },
  273.     
  274.     keyDown : function(e)
  275.     {
  276.         RILoptions.keysDown.push(e.keyCode);
  277.     e.preventDefault();
  278.     e.stopPropagation();
  279.         RIL.xul('newKey').value = '';
  280.     },
  281.     
  282.     keyUp : function(e)
  283.     {
  284.         let i = RILoptions.keysDown.indexOf(e.keyCode);
  285.         if (i >= 0)
  286.             RILoptions.keysDown.splice(i,1);
  287.     e.preventDefault();
  288.     e.stopPropagation();
  289.     },
  290.     
  291.     /*
  292.      
  293.      // on a mac these do not work with onkeypress:
  294.      alt + X = Z
  295.      alt + shift + X = shift + Z
  296.      
  297.      // these work:
  298.      alt + control + X
  299.      alt + shift + control + X     
  300.      
  301.      
  302.      //LEFTOFF:
  303.      http://www.quirksmode.org/js/keys.html
  304.      
  305.      keyCode and charCode are different for keyUp/keyDown/keyPress...
  306.      
  307.     */   
  308.     
  309.     detectKey : function(event) {
  310.         try{
  311.     event.preventDefault();
  312.     event.stopPropagation();
  313.         
  314.         let keyCode = event.keyCode;
  315.         let altKey = event.altKey;
  316.         
  317.         RIL.APP.d( event.charCode )
  318.         RIL.APP.d( RIL.APP.ar(RILoptions.keysDown))
  319.         
  320.         // Mac alt workaround        
  321.         if (navigator.userAgent.match('Macintosh') &&
  322.             event.charCode > 150 &&
  323.             !event.ctrlKey &&
  324.             RILoptions.keysDown.length)
  325.         {
  326.             RIL.APP.d('hack');
  327.             altKey = true; //force and assume
  328.             
  329.             // now figure out what the other key was
  330.             // work backwards assuming the last key push will be at the bottom
  331.             for(let i=RILoptions.keysDown.length-1; i>=0; i--)
  332.             {
  333.                 keyCode = RILoptions.keysDown[i];
  334.                 
  335.                 // ignore modifer keys
  336.                 if (keyCode >= 16 && keyCode <= 18) continue;
  337.                 
  338.                 //else take the last key (now = keyCode)
  339.                 break;
  340.             }
  341.             RIL.APP.d('code ' + keyCode);
  342.             
  343.         }
  344.         
  345.     
  346.     let modifiers = '';
  347.     if (!RIL.xul('keyboardShortcuts').selectedItem.getAttribute('singleKey'))
  348.     {
  349.         modifiers = [];
  350.         if(altKey) modifiers.push("alt");
  351.         if(event.ctrlKey) modifiers.push("control");
  352.         if(event.metaKey) modifiers.push("meta");
  353.         if(event.shiftKey) modifiers.push("shift");        
  354.         modifiers = modifiers.join(" ");
  355.     }
  356.     
  357.     let key = "";        
  358.     if (keyCode)
  359.     {
  360.             if (keyCode >= 40 && keyCode <= 90)
  361.                 keyCode = String.fromCharCode(keyCode).toUpperCase();
  362.             else 
  363.                 keyCode = RILoptions.gVKNames[keyCode];     
  364.     }
  365.     else if(event.charCode)
  366.     {
  367.         key = String.fromCharCode(event.charCode).toUpperCase();
  368.     }
  369.         if(!keyCode && !key) return;
  370.     
  371.     RILoptions.lastKeySet = (modifiers ? modifiers + '||' : '') + ((key)?(key):(keyCode));
  372.     RIL.xul('newKey').value = RIL.formatKey( modifiers, key, keyCode );
  373.         }catch(e){Components.utils.reportError(e);RIL.APP.d(e)}
  374.     },
  375.     
  376.     setKey : function(event) {
  377.     if (RILoptions.lastKeySet && RIL.xul('keyboardShortcuts').selectedItem) {
  378.         RIL.xul('keyboardShortcuts').selectedItem.value = RILoptions.lastKeySet;
  379.         RIL.xulId( RIL.xul('keyboardShortcuts').selectedItem.id ).value = RILoptions.lastKeySet        
  380.         RIL.xulId( RIL.xul('keyboardShortcuts').selectedItem.id + '-v' ).setAttribute('label' , RIL.xul('newKey').value );
  381.     }
  382.     },
  383.     
  384.     disableKey : function(event) {
  385.     if (RIL.xul('keyboardShortcuts').selectedItem) {
  386.         if (RIL.xul("disableKey").label == 'Enable')
  387.         {
  388.         RILoptions.selectKey(null, true);
  389.         }
  390.         else
  391.         {
  392.         RIL.xul('keyboardShortcuts').selectedItem.value = '';
  393.         RIL.xulId( RIL.xul('keyboardShortcuts').selectedItem.id ).value = '';        
  394.         RIL.xulId( RIL.xul('keyboardShortcuts').selectedItem.id + '-v' ).setAttribute('label' , '' );
  395.         RILoptions.selectKey();
  396.         }
  397.     }
  398.     },
  399.     
  400.     
  401.     // -- Tweaks -- //
  402.     
  403.     configureAppearance : function()
  404.     {
  405.     try {
  406.         this.setDrop('optionsTextView', 'showStatusIconText');
  407.         this.setDrop('optionsShare', 'showStatusIconShare');
  408.         this.setDrop('optionsClick', 'showStatusIconClick');        
  409.         
  410.         this.setDrop('optionsListLayout', 'list-view');
  411.         this.setDrop('optionsList', 'list-place');
  412.         this.setDrop('optionsListFormat', 'list-type');
  413.         this.setText('optionsPerPage', 'list-page');
  414.         this.setCheck('optionsUnreadCount', 'show-count');
  415.         this.setCheck('optionsShowDate', 'show-date');
  416.                             
  417.         RIL.xul('optionsPerPage').onchange = this.validatePerPage;        
  418.         
  419.         this.togglePerPage();  
  420.         
  421.         
  422.     } catch(e) {
  423.             Components.utils.reportError(e);
  424.     }
  425.         
  426.     },
  427.     
  428.     listSizeWarning : function()
  429.     {
  430.         if (RIL.xul('optionsListFormat').selectedItem.value == 'scroll' && RIL.APP.LIST.list.length > 300)
  431.             RIL.APP.PROMPT.alert(window, 'Just a heads up...', 'The scrollable list has to load your entire list.  Due to the number of items in your list, it may load slower than using pages.');
  432.     },
  433.     
  434.     togglePerPage : function()
  435.     {        
  436.         RIL.xul('optionsPerPage').disabled = !(RIL.xul('optionsListFormat').selectedItem.value == 'pages'); 
  437.     },
  438.     
  439.     validatePerPage : function()
  440.     {
  441.     try{
  442.         let perPage = RIL.xul('optionsPerPage').value + '';    
  443.         if (!perPage.match(/^[0-9]{1,3}$/))
  444.         RIL.xul('optionsPerPage').value = RIL.APP.PREFS.get('list-page');
  445.     } catch(e){
  446.         Components.utils.reportError(e);
  447.     }
  448.     },    
  449.     
  450.     // -- Customize -- //
  451.     
  452.     configureTweaks : function()
  453.     {
  454.     try {
  455.  
  456.         this.setDrop('optionsButton', 'read');
  457.         this.setDrop('optionsMarkAsRead', 'mark');
  458.         this.setDrop('optionsOpenIn', 'open');        
  459.         this.setCheck('optionsAutoMarkItems', 'autoMark');
  460.             this.setCheck('optionsAutoClose', 'autoCloseTab');     
  461.         this.setCheck('optionsAutoSync', 'autoSync');
  462.             this.setCheck('optionsSecurePass', 'storeSecurely');            
  463.         
  464.         RIL.xul('optionsAutoMarkItems').onclick = this.toggleAutoMarkRelated;
  465.             
  466.         this.toggleAutoMarkRelated();            
  467.         
  468.     } catch(e) {
  469.             Components.utils.reportError(e);
  470.     }
  471.         
  472.     },   
  473.     
  474.     toggleAutoMarkRelated : function()
  475.     {
  476.         RIL.xul('optionsMarkAsRead').disabled = RIL.xul('optionsAutoMarkItems').checked;
  477.     if (RIL.xul('optionsMarkAsRead').disabled)
  478.         RIL.xul('optionsMarkAsRead').selectedIndex = 3;
  479.     }, 
  480.     
  481.     // -- //
  482.     
  483.     setCheck : function(id, prefBoolId, checked)
  484.     {
  485.         let checkmark = RIL.xul(id);
  486.         checkmark.checked = prefBoolId ? RIL.APP.PREFS.getBool(prefBoolId) : checked;
  487.         if (prefBoolId)
  488.             this.checkmarks[prefBoolId] = checkmark;
  489.     },
  490.     
  491.     setDrop : function(id, prefId)
  492.     {
  493.         let drop = RIL.xul(id);
  494.         let value = RIL.APP.PREFS.get(prefId);
  495.         let items = drop.getElementsByTagName('menuitem');
  496.         
  497.         for(let i=0; i<items.length; i++)
  498.         {
  499.             if (items[i].value == value)
  500.             {                
  501.                 drop.selectedItem = items[i];
  502.                 break;
  503.             }   
  504.         }
  505.         
  506.         if (prefId)
  507.             this.drops[prefId] = drop;
  508.     },
  509.     
  510.     setText : function(id, prefId)
  511.     {
  512.         let field = RIL.xul(id);
  513.         field.value = RIL.APP.PREFS.get(prefId);
  514.         
  515.         if (prefId)
  516.             this.texts[prefId] = field;
  517.     }
  518.     
  519. }
  520.  
  521. RILoptions = new RILoptions();